package proxy;

import tx.TransactionManager;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//JDK动态代理的解决方案
public class JDKDynamicProxy implements InvocationHandler {


    //    定义一个目标对象
    private Object target;

   //    完成额外操作的对象，事物模块的对象
    private TransactionManager tx;

//添加构造方法：完成目标对象以及事物对象的初始化
    public JDKDynamicProxy(Object target, TransactionManager tx) {
        this.target = target;
        this.tx = tx;
    }

//    添加非静态的自定义方法 getProxy()； 主要用于完成目标对象的代理类获取
    public Object getProxy(){
        /**
         * ClassLoder :类加载器
         *    理解思路：1.代理类不存在，所以就没有相应的类加载器
         *             2.可以使用项目中的，其他类的加载器
         *
         * Interfaces：表示目标对象的类  所有实现的接口
         *    理解思路：1.为了让代理类看起来和目标类一样
         *             2.就是实现目标对象所有的接口
         *
         * this：表示代理对象方法的重写。
         *    理解思路：1.方法的重写主要是为了完成额外的操作(事务控制等等）
         *             2.完成本职工作，调用目标对象的方法
         */

        Object proxy= Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
        return proxy;
    }

    //回调函数
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //完成额外操作
        tx.open1();

        //完成本职工作：使用方法对象method.invoke()反射机制
        //方法对象时根据 客户端发送不同的方法调用完成的。

        Object result=method.invoke(target,args);

        tx.commit();

        return result;
    }
}














